πŸ‘©πŸΏβ€πŸ¦°Basic Socket.io νŠœν† λ¦¬μ–Ό with Mysql (1)

πŸ‘¦πŸ»Basic Socket.io

λ‚΄κ°€ μƒκ°ν•˜λŠ” ν•œ 쀄 μš”μ•½ : on κ³Ό emit 의 ν‹°ν‚€ 타카 이닀.

Tiqui-Taca barca ?

μ € μ‹œμ¦Œμ˜ λ°”λ₯΄μ…€λ‘œλ‚˜λŠ” 뭐.. μ—­λŒ€κΈ‰μ΄κ΅¬λ‚˜.. 😱

μ—¬νŠΌ κ°μ„€ν•˜κ³  νŠœν† λ¦¬μ–Ό μˆœμ„œλŒ€λ‘œ 따라해 보면 socket.io 의 μ „λΆ€λŠ” 아닐 지라도 μ•„μ£Ό λ―Έμ„Έν•œ 기초 μ •λ„λŠ” μ•Œ 수 μžˆμ§€ μ•Šμ„κΉŒ κΈ°λŒ€ν•˜λ©° (νŽ˜μ–΄λ‹˜? λ³΄κ΅¬κ³„μ‹œμ§€μœ ?πŸ˜‚) κ°€λ³΄μ¦ˆμ•„!

1. Create empty directory

일단 빈 디렉토리 ν•˜λ‚˜ λ§Œλ“€κ³ 

2. Create file β€œserver.js”

에디터λ₯Ό μ—΄λ“  ν•΄μ„œ server.js λ₯Ό 생성 이후 아무 μ½˜μ†”λ‘œκ·Έλ‚˜ κ°™λ‹€ 찍어 놓고

3. node server.js 둜 ν™•μΈν•˜κΈ°

4. Install necessary modules

μ μ ˆν•œ 디렉토리λ₯Ό ν•˜λ‚˜ λ§Œλ“€κ³  거기에닀가

npm init -y 둜 package.json μƒμ„±ν•˜κΈ°

npm install express http cors nodemon (package.json μ—μ„œ nodemon 으둜 start μ‹œ μ»€λ§¨λ“œλ₯Ό μ§€μ •ν•΄μ€€λ‹€)

5. server.js μž‘μ„±ν•˜κΈ°

const express = require('express')
const cors = require('cors')

// ? create instance of express
const app = express()

// ? allows all CORS
app.use(cors())

// ? use http with instance of express
const http = require('http').createServer(app)

const port = 3000

// ? start the server

http.listen(port, () => {
  console.log(`Listening to port ${port}`)
})

λ”μ΄μƒμ˜ μžμ„Έν•œ μ„€λͺ…은 μƒλž΅ν•©λ‹ˆλ‹€.

6. nodemon server.js 둜 확인해 λ³Ό 것, μ„œλ²„ μ‹œμž‘μ΄ λ˜λŠ”κ°€?

λΈŒλΌμš°μ € μƒμ—μ„œ localhost:3000 은 Cannot GET / μ΄λΌλŠ” 문ꡬλ₯Ό 확인할 수 μžˆλ‹€.

7. Create a simple GET request (in server.js)

app.get('/', (req, res) => {
  res.send('Simple GET request!🐝')
})

이제 localhost:3000 에 μ ‘μ†ν•˜λ©΄ μ‘λ‹΅μœΌλ‘œ 받은 문ꡬ가 좜λ ₯λ˜μ–΄ μžˆλŠ” 것을 확인할 수 μžˆλ‹€.

1

8. Integrate Socket

socket.io λ₯Ό μ„€μΉ˜ν•œλ‹€. (for serverside)

npm install socket.io

κ³΅μ‹λ¬Έμ„œμ—λ„ λ‚˜μ™€ μžˆμ§€λ§Œ socket.io λ₯Ό μ“Έ λ•ŒλŠ” http λͺ¨λ“ˆκ³Ό express λͺ¨λ“ˆμ„ ν˜Όν•© μ‚¬μš©ν•œλ‹€.

server.js 내에 μ•„λž˜ μ½”λ“œλ₯Ό http λ³€μˆ˜ μ„ μ–Έν•œ λΆ€λΆ„ μ•„λž˜μ—λ‹€ μž‘μ„±ν•œλ‹€.

// create socket instance with http
const io = require('socket.io')(http)

// add listeners for new connection
// μ‹€μ‹œκ°„ chat (socket) 을 μ‚¬μš©ν•˜λŠ” μ‚¬μš©μžλ₯Ό μœ„ν•œ νŒŒλΌλ―Έν„°, socket
io.on('connection', socket => {
  // this is socket for each user
  console.log('User connected', socket.id)
  // 이따 ν„°λ―Έλ„μ—μ„œ λ³΄κ² μ§€λ§Œ 맀번 μš”μ²­μ‹œλ§ˆλ‹€ socket.id κ°€ λ‹€λ₯΄κ²Œ ν™•μΈλœλ‹€.
})

2

9. make index.html on same root directory

같은 λ£¨νŠΈμ— index.html νŒŒμΌμ„ λ§Œλ“ λ‹€.

<!-- socket.io-client λ₯Ό 뢈러였게 ν•œλ‹€. body νƒœκ·Έ λ§ˆμ§€λ§‰μ— μž‘μ„±ν•΄μ„œ -->
<!-- io λͺ¨λ“ˆμ„ 전역에 λ…ΈμΆœμ‹œν‚€λŠ” 의미 -->
<!-- io λͺ¨λ“ˆ λ‚΄ μΈμžλŠ” λ°±μ—”λ“œμ˜ μ£Όμ†Œ-->

<script src="/socket.io/socket.io.js"></script>

<script>
  const socket = io('http://localhost:3000')
</script>

μ΄λ ‡κ²Œ μž‘μ„±ν•˜κ³ 

server.js λ‚΄ μ½”λ“œμ˜ simple get request 뢀뢄을 μ•„λž˜μ™€ 같이 μˆ˜μ •ν•œλ‹€.

// ? Create a Simple GET request
app.get('/', (req, res) => {
  res.sendFile(__dirname + '/index.html')
})

ν΄λΌμ΄μ–ΈνŠΈμ™€ μ—°κ²°μ‹œν‚€κΈ° μœ„ν•¨μ΄λ‹€. λ¦¬μ•‘νŠΈμ—μ„œλŠ” μ΄λ ‡κ²Œ ν•  ν•„μš”κ°€ μ—†λ‹€. 돈 μ›Œλ¦¬

이후 λΈŒλΌμš°μ € (localhost:3000) 을 μƒˆλ‘œκ³ μΉ¨ ν•˜λ©΄μ„œ nodemon 으둜 μ‹€ν–‰ν•œ 터미널을 μœ μ‹¬νžˆ μ‚΄νŽ΄λ³΄μž.

β€œUser connected abcdefb123456cdefg” λ“±μ˜ 문ꡬ가 λ‚˜μ˜€λŠ” 것을 확인할 수 μžˆλ‹€. λ’€μ˜ μ΄μƒν•œ λ¬Έμžκ°€ λ°”λ‘œ socket.id 이닀.

3

10. Send message

index.html λΆ€λΆ„μ—μ„œ μž‘μ„±ν•œ μ½”λ“œ μ—μ„œ λ‘λ²ˆμ§Έ script νƒœκ·Έ λΆ€λΆ„ μ•„λž˜μ— socket.emit μ΄ν•˜μ˜ μ½”λ“œλ₯Ό μΆ”κ°€ν•œλ‹€.

<script>
  const socket = io('http://localhost:3000')
  socket.emit('new_message', 'Hello, Socket.io!🐀')
</script>

sending message from client, also server should listen from each client via it’s socket.

μ„œλ²„μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ„ λ°›μ•„μ£ΌκΈ° μœ„ν•΄μ„œλŠ” ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ„ λ“€μ–΄μ•Ό ν•œλ‹€.

ν˜„μž¬λŠ” ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ„œλ²„λ‘œ new_message λΌλŠ” νŒŒλΌλ―Έν„° λ³€μˆ˜λ₯Ό 톡해 λ©”μ‹œμ§€λ₯Ό μ„œλ²„λ‘œ μ „λ‹¬ν•˜κ³ μž ν•œλ‹€.

λ°”λ‘œ 이 λ•Œ μ“°λŠ” μ½”λ“œκ°€ emit 이닀! (λ°œμŒμ— μœ μ˜ν•  것)

11. μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ λ˜μ§„ λ©”μ‹œμ§€λ₯Ό 받을 μ€€λΉ„λ₯Ό ν•΄μ•Ό ν•œλ‹€. (server.js)

ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ„œλ²„λ‘œ λ©”μ‹œμ§€λ₯Ό λ³΄λƒˆμœΌλ‹ˆ, μ„œλ²„λŠ” 이 λ©”μ‹œμ§€λ₯Ό 받을 μ€€λΉ„λ₯Ό ν•΄μ•Ό ν•œλ‹€.

server.js λ‚΄ μ½”λ“œμ—μ„œ

io.on 으둜 μ‹œμž‘ν•˜λŠ” κΈ°μ‘΄ μ½”λ“œ λ‚΄ console.log μ•„λž˜μ— socket.on μ΄ν•˜μ˜ μ½”λ“œλ₯Ό μΆ”κ°€ν•΄ λ³Έλ‹€.

io.on(β€œconnection”, (socket) => {
  // this is socket for each user
  console.log("User connected", socket.id);
  socket.on("new_message", (data) => {
      console.log("Client says", data);
    })
});

μ„œλ²„μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ„ λ°›μ•„μ£ΌκΈ° μœ„ν•΄μ„œλŠ” ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ„ λ“€μ–΄μ•Ό ν•œλ‹€.

κ·Έ λ•Œ μ“°λŠ” μ½”λ“œκ°€ λ°”λ‘œ on 이닀!

νŒŒλΌλ―Έν„°λ‘œ 받은 socket 을 κ°€μ Έμ™€μ„œ, ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ emit 으둜 μž‘μ„±ν•œ newmessage 의 λ³€μˆ˜λ₯Ό μΌμΉ˜μ‹œμΌœ 첫번째 νŒŒλΌλ―Έν„°μ— λ„£λŠ”λ‹€. (newmessage)

λ‘λ²ˆμ§Έ νŒŒλΌλ―Έν„°μ˜ data λŠ” ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­ λ‘λ²ˆμ§Έ νŒŒλΌλ―Έν„°μ— λ‹΄κΈ΄ 값을 μ˜λ―Έν•œλ‹€.

이제 ν΄λΌμ΄μ–ΈνŠΈ (λΈŒλΌμš°μ €) λ₯Ό μƒˆλ‘œκ³ μΉ¨ ν•΄ μ£Όκ³  nodemon 으둜 열어놓은 터미널을 보면,

β€œClient says Hello, Socket.io!πŸ€β€ λΌλŠ” 문ꡬλ₯Ό 확인 ν•  수 μžˆμ„ 것이닀.

즉, ν΄λΌμ΄μ–ΈνŠΈμ˜ λ©”μ‹œμ§€λ₯Ό μ„œλ²„κ°€ λ“£κ²Œ 된 것이닀 (ν•˜λŠλ‹˜ λ“€μœΌμ…¨λ‚˜μš”? 같은 λŠλ‚Œ)

4

12. μ„œλ²„μ—μ„œλ„ λ©”μ‹œμ§€λ₯Ό ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 전달해 쀄 수 μžˆλ‹€.

ν˜„μž¬ μž‘μ„±λœ μ½”λ“œμ—μ„œ,

console.log μ•„λž˜μ— io.emit μ½”λ“œλ₯Ό λ‹€μŒκ³Ό 같이 μž‘μ„±ν•œλ‹€.

io.on('connection', socket => {
  // this is socket for each user
  console.log('User connected', socket.id) // 이따 ν„°λ―Έλ„μ—μ„œ λ³΄κ² μ§€λ§Œ 맀번 μš”μ²­μ‹œλ§ˆλ‹€ socket.id κ°€ λ‹€λ₯΄κ²Œ ν™•μΈλœλ‹€.
  socket.on('new_message', data => {
    console.log('Client says', data)

    // ? μ˜€μΌ€μ΄ κ·Έ λ‹€μŒμ€ socket.io 둜 μ—°κ²°λœ λͺ¨λ“  ν΄λΌμ΄μ–ΈνŠΈλ“€μ—κ²Œ μ„œλ²„κ°€ λ©”μ‹œμ§€λ₯Ό λ³΄λ‚΄κ²Œ ν•  것이닀.

    io.emit('new_message', 'Hello, Client😊')
  })
})

자 이제 이걸 ν΄λΌμ΄μ–ΈνŠΈκ°€ λ“£κ²Œ ν•˜λ €λ©΄?

λ‹€μ‹œ ν΄λΌμ΄μ–ΈνŠΈ (index.html) 둜 λŒμ•„κ°€μ„œ .on 으둜 μ„œλ²„λ‘œλΆ€ν„°μ˜ 응닡을 λ“£κ²Œ λ§Œλ“€μ–΄μ€˜μ•Ό ν•œλ‹€. κ°€μž!

μ„œλ‘μ— μ–ΈκΈ‰ν–ˆλ˜ λ©”μ‹œμ§€λ₯Ό 보내기 (emit), λ©”μ‹œμ§€ μš”μ²­μ„ λ“£κΈ° (on) λΌλŠ” λ‚΄μš©μ΄ emit κ³Ό on 의 ν‹°ν‚€ 타카 λΌλŠ” 말이 이해가 μ’€ λ κΉŒμš”?😊

13. ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ„œλ²„μ˜ 응닡을 λ°›κ²Œ ν•˜κΈ°. (index.html)

socket.on 을 톡해 μ„œλ²„μ—μ„œ μ „λ‹¬ν•΄μ£ΌλŠ” 응닡을 λ°›λŠ”λ‹€. μž‘μ„±ν•΄λ³΄μž.

<script>
  const socket = io('http://localhost:3000')

  socket.emit('new_message', 'Hello, Socket.io!🐀')

  // client will listen from server
  socket.on('new_message', data => {
    // localhost:3000 νŽ˜μ΄μ§€ λ‚΄ 개발자 도ꡬ μ°½μ—μ„œ 확인해 λ³Ό 것
    console.log('Server says', data)
  })
</script>

5

14. Send message from form and display in list

index.html μ—μ„œ 두 슀크립트 νƒœκ·Έ 사이에 form νƒœκ·Έλ‘œ μž…λ ₯μ°½ λ§Œλ“€μ–΄ λ†“μž.

<form onsubmit="return sendMessage()">
  <input id="message" placeholder="Enter message" />
  <input type="submit" value="Send" />
</form>

λ„ˆλ¬΄ κΈΈλ©΄ μ•ˆλ˜λ―€λ‘œ 2λΆ€μ—μ„œ λ΅™μ‹œλ‹€.🀑


[DotoriMook]
Written by@[DotoriMook]
ν”„λ‘ νŠΈμ—”λ“œ μ£Όλ‹ˆμ–΄ 개발자 λ„ν† λ¦¬λ¬΅μ˜ 기술개발 λΈ”λ‘œκ·Έ μž…λ‹ˆλ‹€.

GitHubMediumTwitterFacebook